#ifndef COMMANDSENDORRECEIVE_H
#define COMMANDSENDORRECEIVE_H

#include <QObject>
#include <QUuid>
#include <QMessageBox>
#include "PackageData.h"
#include "mqclient.h"

struct SaveMessage
{
    QString tablename;
    int function_code;
};

class CommandSendorReceive : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 获取AGV_Message_Sendand_Receive单例实例
     * @return AGV_Message_Sendand_Receive实例指针
     */
    static CommandSendorReceive& getInstance();

    /**
     * @brief  数据下发到中间通信层
     * @param  dataMap 封装数据库操作数据时需包含'data'嵌套的json结构
     * @param  infomap 封装的基本协议数据
     * @param  function_code 功能号
     * @param  is_data 是否包含数据库操作函数
     */
    void sendCommand(const QMap<QString, QVariant>& dataMap,
                     const QMap<QString, QVariant>& infomap,
                     const int& function_code,
                     bool is_data);

    /**
     * @brief  数据解析
     */
    void receiveCommand();

    /**
     * @brief  检测request_id是否重复
     * @param  id 检测对象
     * @return 返回是否重复
     */
    bool isRepeatId(const QString& id);

    /**
     * @brief  删除m_request_ids容器中某个对象
     * @param  id 删除对象
     */
    void deleteRequestId(const QString& id);

    /**
     * @brief  返回request_id指向的结构体对象
     * @param  id 检测对象
     * @return 返回SaveMessage结构体对象
     */
    SaveMessage getSaveMessage(const QString& id);

    /**
     * @brief  返回QMessageBox窗口点击结果
     * @param  Title 提示窗口标题
     * @param  Text 提示窗口内容
     * @return 返回是否操作
     */
    bool isExecute(const QString& Title, const QString& Text);

private:
    /**
     * @brief  构造函数
     * @param  parent 父窗口
     */
    explicit CommandSendorReceive(QObject *parent = nullptr);

    /**
     * @brief  析构函数
     */
    ~CommandSendorReceive();

    /**
     * @brief  禁止拷贝类
     */
    CommandSendorReceive(const CommandSendorReceive&) = delete;
    CommandSendorReceive& operator=(const CommandSendorReceive&) = delete;

    static QMutex m_mutex;
    QMap<QString, SaveMessage> m_request_ids;
};

#endif // COMMANDSENDORRECEIVE_H
